﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Collections;
using System.Configuration;
using System.IO;


namespace HPCloud.Common.Properties
{
    public sealed partial class Settings : Hashtable
    {
        private static Settings defaultInstance = new Settings();
        
        #region Ctors      
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public Settings(Hashtable settings)
        {
            this.Load(settings);
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public Settings(bool isEmpty)
        {
           
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public Settings()
        {
            this.Reset();
        }
        #endregion
        #region Properties
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string DefaultZone
        {
            get
            {
                return (string)this["DefaultZone"];
            }
            set
            {
                this["DefaultZone"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string CredentialListPath
        {
            get
            {
                return Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\HP\CredentialList.xml";
            }         
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public bool EnableCredentialTracking
        {
            get
            {
                return Convert.ToBoolean(this["EnableCredentialTracking"]);
            }
            set
            {
                this["EnableCredentialTracking"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string SSHClientPath
        {
            get
            {
                return (string)this["SSHClientPath"];
            }
            set
            {
                this["SSHClientPath"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string KeyStoragePath
        {
            get
            {
                return Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            }         
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string LogReadAttemptIntervalInMilliSeconds
        {
            get
            {
                return (string)this["LogReadAttemptIntervalInMilliSeconds"];
            }
            set
            {
                this["LogReadAttemptIntervalInMilliSeconds"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string LogReadAttemptsMax
        {
            get
            {
                return (string)this["LogReadAttemptsMax"];
            }
            set
            {
                this["LogReadAttemptsMax"] = value;
            }
        }  
////==================================================================================================
///// <summary>
///// 
///// </summary>
////==================================================================================================
//        public string PuttuGenPath
//        {
//            get
//            {
//                return (string)this["PuttuGenPath"];
//            }
//            set
//            {
//                this["PuttuGenPath"] = value;
//            }
//        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string LocalTestDirectory
        {
            get
            {
                return (string)this["LocalTestDirectory"];
            }
            set
            {
                this["LocalTestDirectory"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string AuthenticationServiceURI
        {
            get
            {
                return (string)this["AuthenticationServiceURI"];
            }
            set
            {
                this["AuthenticationServiceURI"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string ReleaseNotesURI
        {
            get
            {
                return (string)this["ReleaseNotesURI"];
            }
            set
            {
                this["ReleaseNotesURI"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public int HttpTimeoutInterval
        {
            get
            {
                return Convert.ToInt32(this["HttpTimeoutInterval"]);
            }
            set
            {
                this["HttpTimeoutInterval"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string TeststorageContainerSecondary
        {
            get
            {
                return (string)this["TeststorageContainerSecondary"];
            }
            set
            {
                this["TeststorageContainerSecondary"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string TeststorageContainer
        {
            get
            {
                return (string)this["TeststorageContainer"];
            }
            set
            {
                this["TeststorageContainer"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string TestVolumeIdUnattached
        {
            get
            {
                return (string)this["TestVolumeIdUnattached"];
            }
            set
            {
                this["TestVolumeIdUnattached"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string TestVolumeId
        {
            get
            {
                return (string)this["TestVolumeId"];
            }
            set
            {
                this["TestVolumeId"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public static Settings Default
        {
            get
            {
                return defaultInstance;
            }
        }        
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public bool UseLocalFileMetaData
        {
            get
            {
                return Convert.ToBoolean(this["UseLocalFileMetaData"]);
            }
            set
            {
                this["UseLocalFileMetaData"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public bool PasteGetURIResultsToClipboard
        {
            get
            {
                return Convert.ToBoolean(this["PasteGetURIResultsToClipboard"]);
            }
            set
            {
                this["PasteGetURIResultsToClipboard"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string DefaultTenantId
        {
            get
            {
                return ((string)(this["DefaultTenantId"]));
            }
            set
            {
                this["DefaultTenantId"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string AccessKey
        {
            get
            {
                return (string)this["AccessKey"];
            }
            set
            {
                this["AccessKey"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string SecretKey
        {
            get
            {
                return (string)this["SecretKey"];
            }
            set
            {
                this["SecretKey"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string Host
        {
            get
            {
                return ((string)(this["Host"]));
            }
            set
            {
                this["Host"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public int MaxKeys
        {
            get
            {
                return ((int)(this["MaxKeys"]));
            }
            set
            {
                this["MaxKeys"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string FileQueueAppPath
        {
            get
            {
                return ((string)(this["FileQueueAppPath"]));
            }
            set
            {
                this["FileQueueAppPath"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string StorageQueueServiceURI
        {
            get
            {
                return ((string)(this["StorageQueueServiceURI"]));
            }
            set
            {
                this["StorageQueueServiceURI"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public bool IsMocked
        {
            get
            {
                return ((bool)(this["IsMocked"]));
            }
            set
            {
                this["IsMocked"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string TestAccountId
        {
            get
            {
                return ((string)(this["TestAccountId"]));
            }
            set
            {
                this["TestAccountId"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string TestFilePath
        {
            get
            {
                return ((string)(this["TestFilePath"]));
            }
            set
            {
                this["TestFilePath"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string TestServerId
        {
            get
            {
                return ((string)(this["TestServerId"]));
            }
            set
            {
                this["TestServerId"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string TestImageId
        {
            get
            {
                return ((string)(this["TestImageId"]));
            }
            set
            {
                this["TestImageId"] = value;
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public string TestFlavorId
        {
            get
            {
                return ((string)(this["TestFlavorId"]));
            }
            set
            {
                this["TestFlavorId"] = value;
            }
        }
        #endregion
        #region Methods
//==================================================================================================
/// <summary>
/// 
/// </summary>
//==================================================================================================
        public void Reset()
        {
            System.Diagnostics.Debug.WriteLine("here");

            if (File.Exists("CLI.config"))
            {
                this.Load("CLI.config");
            }
            else if (File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\" + @"HP\CLI.config"))
            {
                string configFilePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\" + @"HP\CLI.config";
                this.Load(configFilePath);
            }
            else
            {
                throw new InvalidOperationException("Unable to locate CLI.config file.");
            }
        }
//==================================================================================================
/// <summary>
/// 
/// </summary>
/// <param name="settings"></param>
//==================================================================================================
        public void Load (Hashtable settings)
        {
            foreach (DictionaryEntry entry in settings) {
                this.Add(entry.Key, entry.Value);
            }
        }
//==================================================================================================
/// <summary>
/// Fully Qualified path to a config file
/// </summary>
/// <param name="settings"></param>
//==================================================================================================
        public static Settings LoadConfig(string configFilePath)
        {
            try
            {
                Settings settings  = new Settings(true);
                XDocument document = XDocument.Load(configFilePath);

                foreach (XElement element in document.Descendants("add"))
                {
                    string key   = element.Attribute(XName.Get("key")).Value;
                    string value = element.Attribute(XName.Get("value")).Value;
                    settings.Add(key, value);
                }
                return settings;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                throw ex;
            }
        }
//==================================================================================================
/// <summary>
/// Fully Qualified path to a config file
/// </summary>
/// <param name="settings"></param>
//==================================================================================================
        public void Load(string configFilePath)
        {
            try
            {               
                XDocument document = XDocument.Load(configFilePath);
                this.Clear();
                foreach (XElement element in document.Descendants("add"))
                {
                    string key   = element.Attribute(XName.Get("key")).Value;
                    string value = element.Attribute(XName.Get("value")).Value;
                    this.Add(key, value);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                throw ex;
            }           
        }
        #endregion
    }
}

